package com.zbbz.util.mybatis.buff;

import com.ruoyi.common.core.domain.R;
import org.apache.poi.ss.formula.functions.T;

import java.io.Serializable;
import java.util.List;
import java.util.function.Function;

/**
 * @author WangYang
 * @date 2025/02/25/14:47
 */
public class MybatisPlusBuff {

    /**
     * 注入关联数据 多条 适用于list
     */
    public static <T, R> List<T> injectList(List<T> sourceList, List<RelationConfig<T, R>> configs) {
        for (RelationConfig<T, R> config : configs) {
            for (T source : sourceList) {
                // 获取主表的关联 ID
                Serializable id = config.getSourceId().apply(source);
                if (config.getRelationType() == RelationType.ONE_TO_ONE) {
                    // 一对一

                    // 查询副表数据库
                    R target = config.getTargetLoader().apply(id);

                    // 把数据注入到主表
                    config.getSourceSetter().accept(source, target);
                } else if (config.getRelationType() == RelationType.ONE_TO_MANY) {
                    // 一对多
                    List<R> targets = config.getTargetListLoader().apply(id);
                    config.getSourceListSetter().accept(source, targets);
                }
            }
        }
        return sourceList;
    }

    /**
     * 注入关联数据 单条 适用于getById getOne
     */
    public static <T, R> T injectOne(T source, List<RelationConfig<T, R>> configs) {
        for (RelationConfig<T, R> config : configs) {
            // 获取主表的关联 ID
            Serializable id = config.getSourceId().apply(source);
            if (config.getRelationType() == RelationType.ONE_TO_ONE) {
                // 一对一

                // 查询副表数据库
                R target = config.getTargetLoader().apply(id);

                // 把数据注入到主表
                config.getSourceSetter().accept(source, target);
            } else if (config.getRelationType() == RelationType.ONE_TO_MANY) {
                // 一对多
                List<R> targets = config.getTargetListLoader().apply(id);
                config.getSourceListSetter().accept(source, targets);
            }
        }
        return source;
    }
}
